package pe.edu.sistemas.samupg.view.managedbeans.admin;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DualListModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.sistemas.samupg.domain.model.Maestria;
import pe.edu.sistemas.samupg.domain.model.Periodo;
import pe.edu.sistemas.samupg.repository.dao.MaestriaDAO;
import pe.edu.sistemas.samupg.repository.dao.PeriodoDAO;

@SuppressWarnings("serial")
@Scope("view")
@Controller
@ManagedBean
public class AbrirPeriodoController implements Serializable {

	private List<Periodo> periodos;
	private Periodo periodoNuevo;
	private DualListModel<Maestria> maestrias;
	
	private String tipo;

	@Autowired
	private PeriodoDAO periodoBean;

	@Autowired
	private MaestriaDAO maestriaBean;

	@PostConstruct
	public void init() {
		periodos = periodoBean.findAll();
		//periodoNuevo = new Periodo();

		//inicializarPickListMaestria(0);
	}
	
	public void initPeriodo(ActionEvent evt) {
		tipo = (String) evt.getComponent().getAttributes().get("tipo");
		switch (tipo) {
		case "0":
			periodoNuevo = new Periodo();
			inicializarPickListMaestria(0);
			break;

		default:
			break;
		}
	}

	private void inicializarPickListMaestria(int idPeriodo) {
		List<Maestria> source = maestriaBean.findAll();
		List<Maestria> target;

		if (idPeriodo == 0) {
			target = new ArrayList<Maestria>();
		} else {
			target = maestriaBean.findxPeriodoId(idPeriodo);
		}

		maestrias = new DualListModel<Maestria>(source, target);
	}

	public void validarPeriodoListener() {
		RequestContext context = RequestContext.getCurrentInstance();

		boolean band = true;
		if (periodoNuevo.getFechaInicio().after(periodoNuevo.getFechaFin())) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN,
							"Error de Fechas", "Error de fechas"));
			band = false;
		}

		// if (periodoBean.getPeriodoActual() != null) {
		// FacesContext
		// .getCurrentInstance()
		// .addMessage(
		// null,
		// new FacesMessage(
		// FacesMessage.SEVERITY_WARN,
		// "Existe ya un periodo abierto, primero debe cerrarlo",
		// "Error de fechas"));
		// band = false;
		// existePeriodoActual = true;
		// }
		context.addCallbackParam("validoFecha", band);
	}

	public void guardarPeriodoListener() {
		boolean band = false;

		if (periodoBean.getPeriodoActual() != null) {
			periodoBean.cerrarPeriodoActual();
		}

		Date now = new Date();
		periodoNuevo
				.setActual((periodoNuevo.getFechaInicio().before(now) && periodoNuevo
						.getFechaFin().after(now)) ? true : false);

		periodoNuevo.setMaestrias(new HashSet<>(maestrias.getTarget()));
		periodoBean.create(periodoNuevo);
		band = true;
		RequestContext context = RequestContext.getCurrentInstance();
		context.addCallbackParam("guardoExito", band);

		FacesContext.getCurrentInstance().addMessage(
				"msgsFinal",
				new FacesMessage(FacesMessage.SEVERITY_INFO,
						"El periodo se registr� exitosamente",
						"El periodo se registr� exitosamente"));

		limpiarPeriodoNuevo();

		// Boolean isActual = periodoNuevo.getActual();
		//
		// if (isActual) {
		// periodoBean.guardarPeriodoActual(periodoNuevo);
		//
		// } else {
		// periodoBean.create(periodoNuevo);
		// }
		//
		// FacesContext.getCurrentInstance().addMessage(null,
		// new FacesMessage("Se ingres� correctamente el nuevo per�odo"));
		//
		// limpiarPeriodoNuevo();
		//
		// periodos = periodoBean.findAll();
	}

	private void limpiarPeriodoNuevo() {
		periodoNuevo = new Periodo();
	}

	public List<Periodo> getListPeriodos() {
		return periodos;
	}

	public Periodo getPeriodoNuevo() {
		return periodoNuevo;
	}

	public void setPeriodoNuevo(Periodo periodoNuevo) {
		this.periodoNuevo = periodoNuevo;
	}

	public DualListModel<Maestria> getMaestrias() {
		return maestrias;
	}

	public void setMaestrias(DualListModel<Maestria> maestrias) {
		this.maestrias = maestrias;
	}
}
